package cn.qy.kotlin.base

import java.util.*

/**
 * 数据类型和变量
 */
// 编译时常量（文件级变量在定义时就必须赋值），只能是基本数据类型 + String。可以理解为 Java 中的静态常量。
const val abc = 123
// 不在方法体里的变量
val date = Date()

fun main() {
    // Kotlin 在后台改用了性能更佳的基本数据类型。假如你熟悉 Java 的八大基本数据类型，也能在 Kotlin 中分别找到它们的对应引用数据类型
    // var 为变量定义关键字， b 是变量名， Int 是类型定义， = 是赋值运算符
    var b: Byte = 1
    val s: Short = 2
    // 整型类型默认是 Int 类型
    val i: Int = 3
    // long 只允许大写的 L，不允许小写，由于其可读性不好
    val l: Long = 1234567L
    println("Byte = $b, Short = $s, Int = $i, Long = $l")
    // 进制表示
    val decimalInt = 28         // 十进制表示
    val binaryInt1 = 0b11100    // 二进制表示
    val binaryInt2 = 0B11100    //二进制表示
    val hexadecimalInt1 = 0x1C    //十六进制表示
    val hexadecimalInt2 = 0X1C    //十六进制表示

    val uByte : UByte = 12U
    println(uByte)
    val uInt : UInt = 123U
    println(uInt)

    // 声明 var 变量
    var c: Char = 'x'
    val str: String = "hello"
    println("Char = $c, String = $str")
    // 浮点类型默认是 Double 类型
    val d: Double = 1.23
    val f1: Float = 1.23f
    val f2: Float = 1.25F
    println("Float = $f1, Float = $f2, Double = $d")
    // 输出一个默认浮点常量为 Double
    println("默认浮点常量    =  " + 360.66)

    // Boolean 只有 true 和 false 两个取值
    val bool: Boolean = true
    println(bool)

    // 打印字符串
    val playerName = "Estragon"
    println(playerName)

    // 打印编译时常量的值
    println(abc)

    // 数字常量添加下划线，增强可读性
    val e = 160_000_000L       // 表示 160000000 数字
    println("数字常量添加下划线   =  $e")

    fun testNullSafe() {
        var neverNull: String = "This can't be null"            // 1
        // neverNull = null                                        // 2
        var nullable: String? = "You can keep a null here"      // 3
        nullable = null                                         // 4
        var inferredNonNull = "The compiler assumes non-null"   // 5

        // inferredNonNull = null                                  // 6
        fun strLength(notNull: String): Int {                   // 7
            return notNull.length
        }
        strLength(neverNull)                                    // 8
        // strLength(nullable)                                     // 9
    }
    testNullSafe()

    // 拓展了 list，set，map
    val listOf = listOf(2, 1, 3)
    val setOf = setOf(2, 1, 3)
    val mapOf = mapOf(Pair(1, 2))
    println("listOf = $listOf, setOf = $setOf, mapOf = $mapOf")
}




